home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Blender 2.49b / blender-2.49b-windows.exe / $_4_ / .blender / scripts / export-iv-0.1.py < prev    next >
Text File  |  2009-08-31  |  9KB  |  305 lines

  1. #!BPY
  2.  
  3. """
  4. Name: 'OpenInventor (.iv)...'
  5. Blender: 236
  6. Group: 'Export'
  7. Tip: 'Export to OpenInventor file format. (.iv)'
  8. """
  9. __author__ = ("Radek Barton")
  10. __url__ = ["http://blackhex.no-ip.org/"]
  11. __email__ = ["scripts"]
  12. __version__ = "0.1"
  13.  
  14.  
  15. __bpydoc__ = """\
  16. This script exports to the Open Inventor format.
  17.  
  18. Usage:
  19.  
  20. Run this script from "File->Export" menu.
  21.  
  22. Note:
  23. """
  24. # ***** BEGIN GPL LICENSE BLOCK *****
  25. #
  26. # Script copyright (C) Radek Barton
  27. #
  28. # This program is free software; you can redistribute it and/or
  29. # modify it under the terms of the GNU General Public License
  30. # as published by the Free Software Foundation; either version 2
  31. # of the License, or (at your option) any later version.
  32. #
  33. # This program is distributed in the hope that it will be useful,
  34. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  35. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  36. # GNU General Public License for more details.
  37. #
  38. # You should have received a copy of the GNU General Public License
  39. # along with this program; if not, write to the Free Software Foundation,
  40. # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  41. #
  42. # ***** END GPL LICENCE BLOCK *****
  43. #
  44.  
  45. import Blender
  46. math_pi= 3.1415926535897931
  47.  
  48. def WriteHeader(file):
  49.     file.write("#Inventor V2.1 ascii\n\n")
  50.     file.write("Separator\n")
  51.     file.write("{\n")
  52.     file.write("  ShapeHints\n")
  53.     file.write("  {\n")
  54.     file.write("    vertexOrdering COUNTERCLOCKWISE\n")
  55.     file.write("  }\n")
  56.  
  57. def WriteFooter(file):
  58.     file.write("}\n")
  59.  
  60. def WriteMesh(file, ob):
  61.     file.write("  Separator\n")
  62.     file.write("  {\n")
  63.     file.write("    # %s\n" % ob.name)
  64.     WriteMatrix(file, ob)
  65.     mesh = ob.getData()
  66.     WriteMaterials(file, mesh)
  67.     WriteTexture(file, mesh)
  68.     WriteNormals(file, mesh)
  69.     WriteVertices(file, mesh)
  70.     WriteFaces(file, mesh)
  71.     file.write("  }\n")
  72.  
  73. def WriteMatrix(file, ob):
  74.     matrix = ob.getMatrix()
  75.     file.write("    MatrixTransform\n")
  76.     file.write("    {\n")
  77.     file.write("      matrix\n")
  78.     for line in matrix:
  79.         file.write("      %.6f %.6f %.6f %.6f\n" % (line[0], line[1], line[2], line[3]))
  80.     file.write("    }\n")
  81.  
  82. def WriteColors(file, mesh):
  83.     file.write("      vertexProperty VertexProperty\n")
  84.     file.write("      {\n")
  85.     file.write("        orderedRGBA\n")
  86.     file.write("        [\n")
  87.     for face in mesh.faces:
  88.         for I in xrange(len(face)):
  89.             file.write("          0x%02x%02x%02x%02x,\n" % (face.col[I].r,
  90.                 face.col[I].g, face.col[I].b, face.col[I].a))
  91.     file.write("        ]\n")
  92.     file.write("        materialBinding PER_VERTEX\n")
  93.     file.write("       }\n")
  94.  
  95. def WriteMaterials(file, mesh):
  96.     if mesh.materials:
  97.         file.write("    Material\n")
  98.         file.write("    {\n")
  99.         file.write("      ambientColor\n")
  100.         file.write("      [\n")
  101.         for mat in mesh.materials:
  102.             file.write("        %.6f %.6f %.6f,\n" % (mat.mirCol[0], mat.mirCol[1],
  103.                 mat.mirCol[2]))
  104.         file.write("      ]\n")
  105.         file.write("      diffuseColor\n")
  106.         file.write("      [\n")
  107.         for mat in mesh.materials:
  108.             file.write("        %.6f %.6f %.6f,\n" % (mat.rgbCol[0], mat.rgbCol[1],
  109.                 mat.rgbCol[2]))
  110.         file.write("      ]\n")
  111.         file.write("      specularColor\n")
  112.         file.write("      [\n")
  113.         for mat in mesh.materials:
  114.             file.write("        %.6f %.6f %.6f,\n" % (mat.specCol[0] * mat.spec / 2.0,
  115.                 mat.specCol[1] * mat.spec / 2.0,  mat.specCol[2] * mat.spec / 2.0))
  116.         file.write("      ]\n")
  117.         file.write("      emissiveColor\n")
  118.         file.write("      [\n")
  119.         for mat in mesh.materials:
  120.             file.write("        %.6f %.6f %.6f,\n" % (mat.rgbCol[0] * mat.emit,
  121.                 mat.rgbCol[1] * mat.emit, mat.rgbCol[0] * mat.emit))
  122.         file.write("      ]\n")
  123.         file.write("      shininess\n")
  124.         file.write("      [\n")
  125.         for mat in mesh.materials:
  126.             file.write("        %.6f,\n" % (mat.hard / 255.0))
  127.         file.write("      ]\n")
  128.         file.write("      transparency\n")
  129.         file.write("      [\n")
  130.         for mat in mesh.materials:
  131.             file.write("        %.6f,\n" % (1.0 - mat.alpha))
  132.         file.write("      ]\n")
  133.         file.write("    }\n")
  134.         file.write("    MaterialBinding\n")
  135.         file.write("    {\n")
  136.         file.write("      value PER_FACE_INDEXED\n")
  137.         file.write("    }\n")
  138.  
  139. def WriteTexture(file, mesh):
  140.     texture = mesh.faces[0].image # BAD Ju Ju
  141.     if texture:
  142.         file.write("    Texture2\n")
  143.         file.write("    {\n")
  144.         file.write('      filename "%s"\n' % texture.getName())
  145.         file.write("    }\n")
  146.         file.write("    TextureCoordinate2\n")
  147.         file.write("    {\n")
  148.         file.write("      point\n")
  149.         file.write("      [\n")
  150.         if mesh.hasVertexUV():
  151.             for vert in mesh.verts:
  152.                 file.write("        %s %s,\n" % (vert.uvco[0], vert.uvco[1]))
  153.             file.write("      ]\n")
  154.             file.write("    }\n")
  155.             file.write("    TextureCoordinateBinding\n")
  156.             file.write("    {\n")
  157.             file.write("      value PER_VERTEX_INDEXED\n")
  158.             file.write("    }\n")
  159.         elif mesh.hasFaceUV():
  160.             for face in mesh.faces:
  161.                 for uv in face.uv:
  162.                     file.write("        %.6f %.6f,\n" % (uv[0], uv[1]))
  163.             file.write("      ]\n")
  164.             file.write("    }\n")
  165.             file.write("    TextureCoordinateBinding\n")
  166.             file.write("    {\n")
  167.             file.write("      value PER_VERTEX\n")
  168.             file.write("    }\n")
  169.  
  170. def WriteVertices(file, mesh):
  171.     file.write("    Coordinate3\n")
  172.     file.write("    {\n")
  173.     file.write("      point\n")
  174.     file.write("      [\n")
  175.     for vert in mesh.verts:
  176.         file.write("        %.6f %.6f %.6f,\n" % (vert[0], vert[1], vert[2]))
  177.     file.write("      ]\n")
  178.     file.write("    }\n")
  179.  
  180. def WriteNormals(file, mesh):
  181.     file.write("    Normal\n")
  182.     file.write("    {\n")
  183.     file.write("      vector\n")
  184.     file.write("      [\n")
  185.  
  186.     # make copy of vertex normals
  187.     normals = []
  188.     for face in mesh.faces:
  189.         if len(face.v) in [3, 4]:
  190.             if face.smooth:
  191.                 for v in face.v:
  192.                     normals.append(v.no)
  193.             else:
  194.                 for v in face.v:
  195.                     normals.append(face.no)
  196.  
  197.     # write normals
  198.     for no in normals:
  199.         file.write("        %.6f %.6f %.6f,\n" % (no[0], no[1], no[2]))
  200.     file.write("      ]\n")
  201.     file.write("    }\n")
  202.  
  203.     # write way how normals are binded
  204.     file.write("    NormalBinding\n")
  205.     file.write("    {\n")
  206.     file.write("      value PER_VERTEX\n")
  207.     file.write("    }\n")
  208.  
  209. def WriteFaces(file, mesh):
  210.     file.write("    IndexedFaceSet\n")
  211.     file.write("    {\n")
  212.  
  213.     # write vertex paint
  214.     if mesh.hasVertexColours():
  215.         WriteColors(file, mesh)
  216.  
  217.     # write material indexes
  218.     file.write("      materialIndex\n")
  219.     file.write("      [\n")
  220.     for face in mesh.faces:
  221.         file.write("        %i,\n" % face.mat);
  222.     file.write("      ]\n")
  223.  
  224.     # write faces with coordinate indexes
  225.     file.write("      coordIndex\n")
  226.     file.write("      [\n")
  227.     for face in mesh.faces:
  228.         face_v= face.v
  229.         if len(face_v) == 3:
  230.             file.write("        %i, %i, %i, -1,\n" % (face_v[0].index,
  231.                 face_v[1].index, face_v[2].index))
  232.         elif len(face_v) == 4:
  233.             file.write("        %i, %i, %i, %i, -1,\n" % (face_v[0].index,
  234.                 face_v[1].index, face_v[2].index, face_v[3].index))
  235.     file.write("      ]\n")
  236.     file.write("    }\n")
  237.  
  238.  
  239. def WriteCamera(file, ob):
  240.     camera = ob.getData();
  241.     # perspective camera
  242.     if camera.type == 0:
  243.         file.write("  PerspectiveCamera\n")
  244.         file.write("  {\n")
  245.         file.write("    nearDistance %s\n" % (camera.clipStart))
  246.         file.write("    farDistance %s\n" % (camera.clipEnd))
  247.         file.write("  }\n")
  248.     # ortho camera
  249.     else:
  250.         print camera.type
  251.  
  252. def WriteLamp(file, ob):
  253.     lamp = ob.getData();
  254.     # spot lamp
  255.     if lamp.type == 2:
  256.         file.write("    SpotLight\n")
  257.         file.write("    {\n")
  258.         file.write("      intensity %s\n" % (lamp.energy / 10.0))
  259.         file.write("      color %s %s %s\n" % (lamp.col[0], lamp.col[1], lamp.col[2]))
  260.         #file.write("      location %s\n" % ())
  261.         #file.write("      direction %s\n" % ())
  262.         file.write("      dropOffRate %s\n" % (lamp.spotBlend))
  263.         file.write("      cutOffAngle %s\n" % (lamp.spotSize * math_pi / 180.0))
  264.         file.write("    }\n")
  265.  
  266. # script main function
  267. def ExportToIv(file_name):
  268.     scene = Blender.Scene.GetCurrent()
  269.     file = open(file_name, "w")
  270.  
  271.     # make lists of individual ob types
  272.     meshes = []
  273.     lamps = []
  274.     cameras = []
  275.     for ob in scene.objects:
  276.         obtype= ob.type
  277.         if obtype == "Mesh":
  278.             meshes.append(ob);
  279.         #elif obtype == "Lamp":
  280.         #    lamps.append(ob);
  281.         #elif obtype == "Camera":
  282.         #    cameras.append(ob);
  283.         #else:
  284.         #    print "Exporting %s objects isn't supported!" % ob.type
  285.  
  286.     # write header, footer and groups of ob types
  287.     WriteHeader(file);
  288.     #for camera in cameras:
  289.     #  WriteCamera(file, camera);
  290.     #for lamp in lamps:
  291.     #  WriteLamp(file, lamp)
  292.     for mesh in meshes:
  293.         WriteMesh(file, mesh)
  294.     WriteFooter(file)
  295.  
  296.     file.close()
  297.  
  298. def FileSelectorCB(file_name):
  299.     if not file_name.lower().endswith('.iv'):
  300.         file_name += '.iv'
  301.     ExportToIv(file_name)
  302.  
  303. if __name__ == '__main__':
  304.     Blender.Window.FileSelector(FileSelectorCB, "Export IV", Blender.sys.makename(ext='.iv'))
  305.